package com.ruoyi.BeansUtil;


import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

/***************************************************************************************************
 * BeanUtil 需要核心方法
 ***************************************************************************************************/
public class BeanInfoUtil {
    /***************************
     * @param obj   获得对象的类型
     ***************************/
    public static Class getClass(Object obj)throws Exception{
        try{
            return obj.getClass();
        }catch(Exception ae){
            throw new Exception("获得对象类型出错!");
        }
    }
    /***************************
     * 通过类型获得对象的类信息
     ***************************/
    public static BeanInfo getBeanInfo(Class clazz) throws Exception{
        try{
            return Introspector.getBeanInfo(clazz);
        }catch(Exception e){
            throw new Exception("获得BEAN类信息出错！");
        }
    }
    /***************************
     * 通过对象获得对象的类信息
     ***************************/
    public static BeanInfo getBeanInfo(Object obj) throws Exception{
        try{
            return BeanInfoUtil.getBeanInfo(obj.getClass());
        }catch(Exception e){
            throw new Exception("获得BEAN类信息出错！");
        }
    }
    /***************************
     * 通过类型获得类的所有属性集合
     ***************************/
    public static PropertyDescriptor[] getPropertyDescriptors(Class clazz) throws Exception{
        try{
            return BeanInfoUtil.getBeanInfo(clazz).getPropertyDescriptors();
        }catch(Exception e){
            throw new Exception("获得BEAN类属性信息集合出错！");
        }
    }
    /***************************
     * 通过对象获得类的所有属性集合
     ***************************/
    public static PropertyDescriptor[] getPropertyDescriptors(Object obj) throws Exception{
        try{
            return BeanInfoUtil.getPropertyDescriptors(obj.getClass());
        }catch(Exception e){
            throw new Exception("获得BEAN类属性信息集合出错！");
        }
    }
    /***************************
     * 通过BeanInfo获得类的所有属性集合
     ***************************/
    public static PropertyDescriptor[] getPropertyDescriptors(BeanInfo beanInfo) throws Exception{
        try{
            return beanInfo.getPropertyDescriptors();
        }catch(Exception e){
            throw new Exception("获得BEAN类属性信息集合出错！");
        }
    }
    /***************************
     * 获得BEAN属性的名称
     ***************************/
    public static String getName(PropertyDescriptor props) throws Exception{
        try{
            return props.getName();
        }catch(Exception e){
            throw new Exception("获得BEAN属性的名称出错！");
        }
    }
    /***************************
     * 获得BEAN属性的类型
     ***************************/
    public static Class getPropertyType(PropertyDescriptor props) throws Exception{
        try{
            return props.getPropertyType();
        }catch(Exception e){
            throw new Exception("获得BEAN属性的类型出错！");
        }
    }
    /***************************
     * 获得BEAN属性的get方法
     ***************************/
    public static Method getReadMethod(PropertyDescriptor props) throws Exception{
        try{
            return props.getReadMethod();
        }catch(Exception e){
            throw new Exception("获得BEAN属性的get方法出错！");
        }
    }
    /***************************
     * 获得BEAN属性的set方法
     ***************************/
    public static Method getWriteMethod(PropertyDescriptor props) throws Exception{
        try{
            return props.getWriteMethod();
        }catch(Exception e){
            throw new Exception("获得BEAN属性的set方法出错！");
        }
    }
    /*************************************
     * 判断属性名是否是类内部属性 假表示是内部属性
     *************************************/
    public static boolean rightName(PropertyDescriptor props) throws Exception{
        try{
            if(!(("class".equals(props.getName())
                    ||"multipartRequestHandler".equals(props.getName())
                    ||"servlet".equals(props.getName())
                    ||"servletWrapper".equals(props.getName())))){
                return true;
            }return false;
        }catch(Exception e){
            throw new Exception("判断属性名是否是类内部属性出错！");
        }
    }
    /*************************************
     * 获得属性的参数类型集合
     *************************************/
    public static Class[] getParameterTypes(PropertyDescriptor props)throws Exception{
        try{
            return props.getWriteMethod().getParameterTypes();
        }catch(Exception e){
            throw new Exception("获得属性的参数类型集合出错！");
        }
    }
    /*************************************
     * 获得属性的返回类型
     *************************************/
    public static Class getReturnType(PropertyDescriptor props)throws Exception{
        try{
            return props.getReadMethod().getReturnType();
        }catch(Exception e){
            throw new Exception("获得属性的返回类型出错！");
        }
    }
    /*************************************
     * 获得属性的返回类型名称
     *************************************/
    public static String getTypeName(PropertyDescriptor props)throws Exception{
        try{
            return props.getReadMethod().getReturnType().getName();
        }catch(Exception e){
            throw new Exception("获得属性的返回类型名称出错！");
        }
    }
    /*************************************
     * 获得属性的值
     *************************************/
    public static Object getValue(PropertyDescriptor props,Object obj)throws Exception{
        try{
            return props.getReadMethod().invoke(obj,null);
        }catch(Exception e){
            throw new Exception("获得属性的值出错！");
        }
    }
}
